/**
 * 
 */
package org.abettor.smartswt.global;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Widget;

/**
 * 用来保存所有窗口及其子组件的信息
 * @author abettor
 *
 */
public class SingletonGlobalInfo
{
	//	自身引用
	private static SingletonGlobalInfo sgi = null;
	//	窗口及其子组件对象列表
	private Map<String, ShellInfo> info = null;

	//	私有构造函数，禁止直接构造
	private SingletonGlobalInfo()
	{
		info = Collections.synchronizedMap(new HashMap<String, ShellInfo>());
	}

	/**
	 * 获取当前类的唯一实例
	 * @return 当前类的引用
	 */
	public static synchronized SingletonGlobalInfo getInstance()
	{
		if(sgi == null)
		{
			sgi = new SingletonGlobalInfo();
		}

		return sgi;
	}

	/**
	 * 根据窗口对象标识取得对应窗口类
	 * @param shellName 窗口标识符
	 * @return 指定窗口类的引用
	 */
	public synchronized Shell getShell(String shellName)
	{
		ShellInfo shellInfo = info.get(shellName);
		if(shellInfo == null)
		{
			return null;
		}

		return shellInfo.getShell();
	}

	/**
	 * 添加一个窗口到全局信息对象<br />
	 * 如果shellName所指定的窗口对象已存在，将被覆盖，同时包含于之的子组件信息也会被重置
	 * @param shellName 窗口标识符
	 * @param shell 要添加的窗口对象
	 */
	public synchronized void putShell(String shellName, Shell shell)
	{
		ShellInfo shellInfo = new ShellInfo(shell);
		info.put(shellName, shellInfo);
	}

	/**
	 * 获取指定窗口中的指定组件信息
	 * @param shellName 窗口标识符
	 * @param widgetName 指定组件标识符
	 * @return 指定组件的引用
	 */
	public synchronized Widget getWidget(String shellName, String widgetName)
	{
		ShellInfo shellInfo = info.get(shellName);
		if(shellInfo == null)
		{
			return null;
		}

		return shellInfo.getWidgets().get(widgetName);
	}

	/**
	 * 向一个已经存在的窗口信息中添加子组件信息<br />
	 * 如果shellName所指定的窗口信息不存在，不作任何操作<br />
	 * 如果widgetName已经存在，此操作将覆盖原有信息
	 * @param shellName 窗口标识符
	 * @param widgetName 子组件标识符
	 * @param widget 子组件的应用
	 */
	public synchronized void putWidget(String shellName, String widgetName, Widget widget)
	{
		ShellInfo shellInfo = info.get(shellName);
		if(shellInfo == null)
		{
			return;
		}

		shellInfo.getWidgets().put(widgetName, widget);
	}
}
